package com.gjy.sb.disruptor;

import com.lmax.disruptor.RingBuffer;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author gjy
 * @version 1.0
 * @since 2025-08-19 21:50:29
 */
@Service
public class OrderService {

    @Resource
    private RingBuffer<OrderEvent> ringBuffer; // 注入 RingBuffer

    /**
     * 创建订单（发布事件到 Disruptor）
     */
    public void createOrder(String orderId, String productName, Integer quantity, Double price) {
        // 1. 请求下一个可用的序号
        long sequence = ringBuffer.next();
        try {
            // 2. 获取该序号对应的事件对象
            OrderEvent event = ringBuffer.get(sequence);
            // 3. 填充事件数据
            event.setOrderId(orderId)
                    .setProductName(productName)
                    .setQuantity(quantity)
                    .setPrice(price);
            // 4. 发布事件，通知消费者
            // 注意：必须在 finally 块中发布，确保即使填充数据出错也能释放序号
        } finally {
            ringBuffer.publish(sequence);
        }
    }

}
